﻿#region Copyright Notice
// This file is part of GestionPedago.
// <description>
// Copyright (C) 2012 ENI Ecole Informatique
// 
// GestionPedago is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// <program> is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionPedago.Services.Framework;
using GestionPedago.Services.ES;
using GestionPedago.Services.Mapping;
using GestionPedago.Persistence.OPManager;
using GestionPedago.EntityContext;
using GestionPedago.Services.ES.Modele;
using System.Data;
using Persistence.OPManager;

namespace GestionPedago.Services.Traitement
{
    /// <summary>
    /// Classe de traitement du service PlanifierPlanningECF
    /// </summary>
    public class PlanifierPlanningECFTraitement : ITraitement<PlanifierPlanningECFIn, PlanifierPlanningECFOut>
    {
        /// <summary>
        /// Singleton
        /// </summary>
        private static PlanifierPlanningECFTraitement instance;
        
        /// <summary>
        /// Méthode GetInstance
        /// </summary>
        /// <returns>Le singleton</returns>
        public static PlanifierPlanningECFTraitement GetInstance()
        {
            if (instance == null)
            {
                instance = new PlanifierPlanningECFTraitement();
            }
            return instance;
        }

        /// <summary>
        /// Constructeur
        /// </summary>
        private PlanifierPlanningECFTraitement() { }

        /// <summary>
        /// Méthode de traitement
        /// </summary>
        /// <param name="paramEntree">Le paramètre d'entrée du service</param>
        /// <returns>Le paramètre de sortie du service</returns>
        public PlanifierPlanningECFOut Traitement(PlanifierPlanningECFIn paramEntree)
        {

            List<PlanningECF> lstAvantMiseAJour = new List<PlanningECF>();
            Promotion p = null;
            if (paramEntree.Promotion.CodePromotion == "HorsPromo")
            {
                lstAvantMiseAJour = PlanningECFOPManager.GetListePlanningECFHorsPromotion();
            }
            else
            {
                p = PromotionOPManager.GetPromotionByCode(paramEntree.Promotion.CodePromotion);
                lstAvantMiseAJour = p.GetListePlanificationsECF();
            }
           
            List<PlanningECFES> lstRetour = new List<PlanningECFES>();
            EntityConnection.Reinitialisation();
            EntityConnection.ClearEntities();
            foreach (PlanningECFES pee in paramEntree.ListePlanningECF)
            {
                PlanningECF pe;
                if (pee.DejaPlanifie == true)
                {
                    if (pee.CodePlanningECF != 0)
                    {
                        if (pee.DateSuggeree != null)
                            pee.DateECF = (DateTime)pee.DateSuggeree;
                        pe = new PlanningECFMappeur().ES2Entity(pee).MiseAJour();
                        //pe = PlanningECFOPManager.GetPlanningECFByCode(pee.CodePlanningECF).MiseAJour();
                       
                       
                    }
                    else
                    {
                        if (pee.DateSuggeree != null)
                        pee.DateECF = (DateTime)pee.DateSuggeree;
                        pee.CodePromotion = paramEntree.Promotion.CodePromotion;
                        pe = new PlanningECFMappeur().ES2Entity(pee);
                        pe = PlanningECFOPManager.AjouterPlanningECF(pe);
                    }

                    PlanningECFES peeRetour = new PlanningECFMappeur().Entity2ES(pe);
                    peeRetour.DateSuggeree = peeRetour.DateECF;
                    peeRetour.DejaPlanifie = true;
                    lstRetour.Add(peeRetour);
                }
                else
                {
                    if (pee.CodePlanningECF != 0){
                        EntityConnection.ClearEntities();
                        pe = new PlanningECFMappeur().ES2Entity(pee);
                        if (lstAvantMiseAJour.Contains(pe))
                        {
                            //EntityConnection.GetContext().PlanningECF.Attach(pe);
                            PlanningECFOPManager.SupprimerPlanningECF(lstAvantMiseAJour.Find(pecf => pecf.CodePlanningECF == pe.CodePlanningECF ));
                        }
                      /*  else
                        {
                           EntityConnection.GetContext().PlanningECF.Detach(pe);
                        }*/
                    }
                }
            }

            PlanifierPlanningECFOut paramSortie = new PlanifierPlanningECFOut();
            paramSortie.ListePlanningECF = RecupererPlanningECFTraitement.GetInstance().Traitement(new RecupererPlanningECFIn(paramEntree.Promotion)).ListePlanningECF;
            return paramSortie;
        }
    }
}
